import time
class Partie :
    def __init__(self,partie,sock):
        #partie est le msg recu par le serveur tel quel
        partie=partie.split(",")
        print partie
        #etat en attente de joueur
        self.etat=-1
        #etat contient l'etat de la partie
        #>=0 signifie qu'elle est en cours
        #le chiffre indique le joueur qui est en train de jouer
        #-1 signifie qu'il n'y a pas assez de joueur
        #-2 signifie que la partie est perdue
        #-3 signifie que la partie est gagnee
        if len(partie)!=5 :
            print ("erreur des donnees")
        else:
        #nom de la partie:
            self.nomPartie=partie[0]
        #nombre joueurs max dans la partie
            self.nbjoueurs=int(partie[1])
        #difficulte
            self.difficulte=partie[2]
        #liste des joueurs
            self.nomjoueurs=list()
            self.nomjoueurs.append(partie[4])
        #liste des sockets des joueurs
            self.sockJ=list()
            self.sockJ.append(sock)
        #liste mine decouverte
            self.listemines=[0]*self.nbjoueurs

    def addjoueur(self,joueur,sock):
        #ajoute un joueur a une partie
        #verification prealable
        print joueur
        print sock
        if len(self.nomjoueurs)<self.nbjoueurs :
            if self.etat!=-1:
                print "bizarre pas a -1"
            print "ajout"
            self.nomjoueurs.append(joueur)
            print self.nomjoueurs
            self.sockJ.append(sock)
            if len(self.nomjoueurs)==self.nbjoueurs:
                self.startPartie()
                #demarrer la partie
            #for i in self.sockJ:
            #    i.send("nouveau joueur")
            #retourne le num du joueur ajoute
            #return len(self.nomjoueurs)
        else :
            print self.etat
            print len(self.nomjoueurs)
            print self.nbjoueurs
            print("erreur partie deja en cours")

    def deljoueur(self,sock):
        print "deconnect"
        n=self.sockJ.index(sock)
        nom=self.nomjoueurs.pop(n)
        self.sockJ.pop(n)
        self.nbjoueurs=self.nbjoueurs-1
        suppartie=False
        print "deljoueur"
        print len(self.nomjoueurs)
        if len(self.nomjoueurs)==1:
            print "1"
            self.sockJ[0].send("finPartie\n"+self.nomjoueurs[0])
        elif len(self.nomjoueurs)>1:
            print "1"
            for i in self.sockJ:
                i.send("quitte\n"+nom)
        elif len(self.nomjoueurs)==0:
            print "0"
            suppartie=True
        if self.etat==n:
            self.tour()
        return suppartie
                
    def getlistemine(self):
        #retourne une chaine de caractere de mine
        chaine=0
        for i in self.listemines :
            if chaine==0:
                chaine=str(i)
            else :
                chaine=chaine+","+str(i)
        return chaine

    def getetat(self):
        return self.etat

    def getlisteJ(self):
        chaine=0
        for i in self.nomjoueurs :
            if chaine==0:
                chaine=str(i)
            else :    
                chaine=chaine+","+str(i)
        return chaine
    
    def tour(self):
        #passe au joueur suivant
        print "nb j"
        print self.nbjoueurs
        print "etat"
        print self.etat
        print "len sock"
        print len(self.sockJ)
        if self.etat+1<self.nbjoueurs:
            self.etat=self.etat+1
        else :
            self.etat=0
        print self.etat
        print "tour"
        time.sleep(0.25)
        print "envoie"
        print self.sockJ[self.etat] 
        self.sockJ[self.etat].send("toi")
        #return self.etat

    def getinfo(self):
        chaine=self.nomPartie+","+str(self.nbjoueurs)+","+self.difficulte+","+str(len(self.nomjoueurs))+","+str(self.getlisteJ())

        return chaine

    def emiMatrice(self,sock,matrice):
        for i in self.sockJ:
            if i != sock :
                i.send("matrice")
                i.send(matrice)

    def startPartie(self):
        if len(self.nomjoueurs)==self.nbjoueurs :
            self.etat=0
            for i in self.sockJ:
                i.send("listeJoueursFinale\n"+self.getlisteJ())
            self.sockJ[0].send("toi")
        else :
            print "erreur ! Pas assez de joueurs"

    def bombe(self,sock):
        #une bombe a ete decouverte sur sock
        #ajout de un sur la liste du joueur correspondant
        self.listemines[self.sockJ.index(sock)]+=1
        #envoie d'un message
        for i in self.sockJ:
                i.send("modificationCompteur\n",self.getlistJ(),self.getlistemine())

        #au prochain joueur de jouer
        self.tour()

    def quijoue(self,sock):
        #retourne True si c'est au joueur qui envoie la commande de jouer
        #False sinon
        if self.etat==self.sockJ.index(sock):
            return True
        else:
            return False
        

    def clic(self,sock,msg):
        #click de sock
        #msg est la position du click
        #envoie aux autres clients
        for i in self.sockJ:
            if i != sock :
                i.send(msg+","+self.nomjoueurs[self.sockJ.index(sock)])
        #le tour de jeu passe au prochain joueur
        self.tour()

    def perdu(self,sock):
        if self.nbjoueurs==2:
            #le dernier joueur gagne          
            for i in self.sockJ:
                if i != sock :
                    i.send("gagne")
                else :    
                    i.send("partiePerdu")
            self.etat=-2
        else :
            #suppression du joueur concerne dans la partie
            self.nbjoueurs-=1
            #suppression du nom du joueur a partir de l'indice de sa socket dans la liste
            jsup=self.nomjoueurs.pop(self.sockJ.index(sock))
            #jsup stocke le nom supprime
            #suppression de sa socket de la liste des sockets
            sock.send("perdu")
            self.sockJ.remove(sock)
            for i in self.sockJ:
                i.send("partiePerdu")
                i.send(jsup)
            self.tour()

    def message(self,sock,msg):
        for i in self.sockJ:
            if i != sock :
                i.send(msg)
                
                
    
